package com.atguigu.tingshu.album.api;

import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.login.TsLogin;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.common.util.AuthContextHolder;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.atguigu.tingshu.vo.album.AlbumStatVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Tag(name = "专辑管理")
@RestController
@RequestMapping("api/album/albumInfo")
@SuppressWarnings({"all"})
public class AlbumInfoApiController {

    @Autowired
    private AlbumInfoService albumInfoService;


    /**
     * 根据专辑Id 获取到统计信息
     * @param albumId
     * @return
     */
    @Operation(summary = "获取到专辑统计信息")
    @GetMapping("/getAlbumStatVo/{albumId}")
    public Result<AlbumStatVo> getAlbumStatVo(@PathVariable Long albumId){
        //调用服务层方法
        AlbumStatVo albumStatVo=albumInfoService.getAlbumStatVo(albumId);
        return Result.ok(albumStatVo);
    }


    /**
     * 根据专辑id获取属性值
     * @param albumId
     * @return
     */
    @Operation(summary = "根据专辑id获取属性值")
    @GetMapping("/findAlbumAttributeValue/{albumId}")
    public Result<List<AlbumAttributeValue>> findAlbumAttributeValue(@PathVariable("albumId") Long albumId){
        List<AlbumAttributeValue> albumAttributeValueList=albumInfoService.findAlbumAttributeValue(albumId);
        return Result.ok(albumAttributeValueList);
    }


    @Operation(summary = "获取专辑列表")
    @GetMapping("/findUserAllAlbumList")
    public Result findUserAllAlbumList() {
        //获取用户id
        Long userId = AuthContextHolder.getUserId() == null ? 1 : AuthContextHolder.getUserId();

        //调用服务层方法
        List<AlbumInfo> albumInfoList = albumInfoService.findUserAllAlbumList(userId);
        //想在后面通过userId查询到当前登录的用户id的集合
        return Result.ok(albumInfoList);
    }

    /**
     * 获取专辑详情
     *
     * @param albumId
     * @return
     */

    @Operation(summary = "根据专辑id获取专辑对象")
    @GetMapping("/getAlbumInfo/{albumId}")
    public Result<AlbumInfo> getAlbumInfo(@PathVariable("albumId") Long albumId) {
        // 这里不能直接使用Iservice的getById是因为根据albumId进行查询的话，只能查到专辑的信息
        // 所以这里需要查询出专辑的所有信息，包括专辑的标签，专辑的描述，专辑的图片，专辑的音频，专辑的评论等(使用getAlbumInfoById方法进行实现)
        AlbumInfo albumInfo = albumInfoService.getAlbumInfoById(albumId);
        return Result.ok(albumInfo);
    }

    /**
     * 保存修改信息
     * /updateAlbumInfo/1613
     *
     * @param albumId
     * @param albumInfoVo
     * @return
     */
    @Operation(summary = "保存修改信息")
    @PutMapping("/updateAlbumInfo/{albumId}")
    public Result updateAlbumInfo(@PathVariable Long albumId, @RequestBody AlbumInfoVo albumInfoVo) {
        albumInfoService.updateAlbumInfo(albumId, albumInfoVo);
        return Result.ok();
    }


    /**
     * 根据专辑Id删除专辑
     *
     * @param albumId
     * @return
     */
    @Operation(summary = "根据专辑Id删除专辑")
    @DeleteMapping("/removeAlbumInfo/{albumId}")
    public Result removeAlbumInfo(@PathVariable Long albumId) {
        albumInfoService.deleteAlbumInfo(albumId);
        return Result.ok();
    }

    /**
     * todo --保存专辑--
     * 前面是文件上传、获取分类列表、获取分类的标签值
     * todo 点保存---> 文件上传、分类列表、分类的标签...数据，都以表单的形式进行存储
     * todo 需要做的就是将表单中的数据进行提交保存
     * 1.首先分析，前端传递的数据是什么类型的，json数据，那么就需要用@RequestBody注解进行接收这个json数据
     * 		1.1将接收到的数据转成javaObject以后，封装成Vo，且我们是将每一条数据都要添加到对应的表中，每一条数据
     * 		都对应着一个对象，所以每次都需要 创建相应实体类对象
     * 2.分析，接收到的数据需要存储到相应的什么表中，且我们需要的哪些数据，前端的json数据中没有给我们发送过来
     * 		需要我们自己去封装某些我们业务上实际需要的字段
     * 3.分析，我们每一个模块，就专辑的保存而言，需要有一个登录的状态
     * 		所以我们先设定了一个常在的登录状态
     * 		Long userId = AuthContextHolder.getUserId() == null ? 1l : AuthContextHolder.getUserId();
     * 4.分析，
     * Request URL: http://localhost/api/album/albumInfo/saveAlbumInfo
     * Request Method: POST
     * Status Code: 404 Not Found
     */
    @TsLogin
    @Operation(summary = "保存专辑")
    @PostMapping("/saveAlbumInfo")
    public Result saveAlbumInfo(@RequestBody AlbumInfoVo albumInfoVo) {
        //	登录功能写完成之后，会将用户Id 存储到本地 线程中!
        Long userId = AuthContextHolder.getUserId();
        albumInfoService.saveAlbumInfo(albumInfoVo, userId);
        return Result.ok();
    }

    /**
     * 分页查询展示专辑
     * 这里的@RequestBody 是前端传进来的json数据
     * todo 也就是用来查询的条件
     * {page: 1, limit: 10, status: ""}，添加这个注释用来接收前端的这个json数据
     * 进而转成java进行数据的取值
     * todo 创建分页对象的泛型，是显示的内容信息
     * todo 也就是对我们保存的专辑进行展示
     *
     * @param pageNo
     * @param pageSize
     * @param albumInfoQuery
     * @return
     */
    @TsLogin
    @Operation(summary = "分页查询展示专辑")
    @PostMapping("/findUserAlbumPage/{page}/{limit}")
    public Result findUserAlbumPage(@PathVariable Long page,
                                    @PathVariable Long limit,
                                    @RequestBody AlbumInfoQuery albumInfoQuery) {
        //创建分页对象
        Page<AlbumListVo> albumInfoPage = new Page<>(page, limit);
        //获取用户id
        Long userId = AuthContextHolder.getUserId() == null ? 1l : AuthContextHolder.getUserId();
        //封装数据
        albumInfoQuery.setUserId(userId);
        albumInfoService.findUserAlbumPage(albumInfoPage, albumInfoQuery);
        return Result.ok(albumInfoPage);
    }
}

